<?php
use think\Session;
use think\Db;
use think\Config;
require_once (APP_PATH . 'api/FinanceApi.php');
/**
 * @description  	奖励接口
 * @author      	褚天恩 <chutianen@163.com>
 * @date 2018-03-18 时间
 * @version 1.0.0	版本
 * 
 * 奖金制度
	1、报单奖：使用注册积分注册。
100元/单（后台可设置，不想给的时候设置为0）；

2、直销奖：
注册开通VIP会员时给予直接推荐的上级直销奖，注册金额3000注册积分（后台可修改）；
给上1级900元，（奖金后台可修改）；

3、领导奖：
所获得的领导奖，即新增的业绩必须与自己有血缘关系（直推推荐关系）。
A、一级领导奖：A区（第一条线）团队达到20人（可以是自己推荐的，也可以是上面的人推荐排位的），从第21人开始可获得一级领导奖为新增业绩的6%（3000*6%=180，后台可修改），如果A区下级中再有会员a可获得一级领导奖的，自己不能再获得一级领导奖，这个时候获得平级奖（平级奖为a所获得领导奖奖金的3%，后台可修改）；

  二级领导奖：当A区团队达到50人时，从第51人开始获得二级领导奖为新增业绩的9%（3000*9%=270元）；如果A区下级中有可获得一级领导奖的，却没有可获得二级领导奖的，自己不再获得二级领导奖，自己可获得级差奖3%（3000*3%=90元）；如果A区下级中有a可获得二级领导奖的，自己不再获得二级领导奖，自己可获得平级奖（平级奖为a所获得领导奖奖金的3%）。

三级领导奖：当A区团队达到100人时，A区团队达到100人时可以开通B区（第二条线）。A区从第101人开始获得三级领导奖为新增业绩的12%（3000*12%=360元）；如果A区下级中有可获得一级领导奖的，却没有可获得二级领导奖和三级领导奖的，自己不再获得三级领导奖，自己可获得级差奖6%（3000*6%=180元）；如果A区下级中有可获得二级领导奖却没有可获得三级领导奖的，自己不再获得三级领导奖，自己可获得级差奖3%（3000*3%=90元）；如果A区下级中有a可获得三级领导奖的，自己可获得平级奖（平级奖为a所获得领导奖奖金的3%）。

B、四级领导奖：B区的第一人到50人，新增业绩（血缘关系）的可获得12%领导奖，当B区（第二条线）团队达到50人（可以是自己推荐的，也可以是排位的），从第51人开始可获得四级领导奖为新增业绩的15%（3000*15%=450，后台可修改），如果B区下级中再有会员C可获得四级领导奖的，自己不能再获得四级领导奖，这个时候获得平级奖（平级奖为C所获得领导奖奖金的3%，后台可修改）；

   五级领导奖：当B区团队达到100人时，从第101人开始获得五级领导奖为新增业绩的18%（3000*18%=540元）；如果B区下级中有可获得四级领导奖的，却没有可获得五级领导奖的，自己可获得级差奖3%（3000*3%=90元）；如果B区下级中有C可获得五级领导奖的，自己可获得平级奖（平级奖为C所获得领导奖奖金的3%）。B区团队达到100人时可以开通C区（第三条线）。

C、六级领导奖：C区的第一人到50人，新增业绩（血缘关系）的可获得18%领导奖，当C区（第三条线）团队达到50人（可以是自己推荐的，也可以是排位的），从第51人开始可获得六级领导奖为新增业绩的21%（3000*21%=630，后台可修改），如果C区下级中再有会员D可获得六级领导奖的，自己不能再获得六级领导奖，这个时候获得平级奖（平级奖为D所获得领导奖奖金的21%，后台可修改）；

   七级领导奖：当C区团队达到100人时，从第101人开始获得七级领导奖为新增业绩的24%（3000*24%=720元）；如果C区下级中有可获得六级领导奖的，却没有可获得七级领导奖的，自己可获得级差奖3%（3000*3%=90元）；如果C区下级中有D可获得七级领导奖的，自己不再获得七级领导奖，自己可获得平级奖（平级奖为D所获领导奖得奖金的3%）。


4、平级奖：
在同一条线（同一区）中，自己可以获得下级与自己紧邻可获得同级领导奖的会员的奖励，奖励为获得不同领导奖的百分比。
 * 
 * 
 * 
 * @copyright
 */
class RewardApi {
	/**
	 * 构造函数
	 */
	function __construct(){
		
	}
	/**
	 * 入口文件（奖励）
	 * @param 用户id  $member_id
	 * @param 消费金额    $money
	 * @param 分区	 $type
	 * @param 商品id  $goods_id
	 * @param 订单序列号 $orders_id
	 * @return string
	 */
	public function begin($member_id,$money){
		//直推奖
 		$r[] = $this->zhitui($member_id);
 		//报单中心奖   OK
 		$r[] = $this->baodan($member_id);
 		//应该先判断有没有奖励在计算上线等级
 		//领导奖
 		$r[] = $this->lingdao($member_id,$money);
 		
 		//加业绩
 		$r[] = $this->addYeJi($member_id,$money);
		
		return $r;
	}

	/**
	 * 直推				OK
	 * @param unknown $userId
	 * @param unknown $jifen
	 */
	public function zhitui($member_id){
		$member = Db::name('App_member_relation')->where(array('member_id'=>$member_id))->find();
		$zhitui_member = Db::name('App_member_relation')->where(array('member_id'=>$member['zhuceid']))->find();
		$class = $this->getUserMoneyByLevel($zhitui_member['level']);
		$res = '无直推奖';
		if($class['tuijian_money'] > 0){
			$res = $this->addUserMoney($zhitui_member['member_id'], $class['tuijian_money'], 8);
		}
		return $res;
	}
	/**
	 * 报单中心奖
	 * 注册激活为报单中心每单固定奖励
	 */
	public function baodan($member_id){
		$member_relation = Db::name('App_member_relation')->where(array('member_id'=>$member_id))->find();
		$member_relation_baodan = Db::name('App_member_relation')->where(array('member_id'=>$member_relation['baodan']))->find();
		$class = $this->getUserMoneyByLevel($member_relation_baodan['level']);
		if($member_relation_baodan){
			$jiangli = $class['baodan'];
			if($jiangli > 0){
				$r = $this->addUserMoney($member_relation_baodan['member_id'],$jiangli,9);
			}
		}
		return $r;
	}
	/**
	 * 领导奖
	 * @param unknown $member_id
	 */
	public function lingdao($member_id,$money){
		$member = Db::name('App_member_relation')->where(array('member_id'=>$member_id))->find();
		//查找推荐上线
		$list = $this->getUpUserByTuiJianId($member_id, 9999);
		$l_level = 0;
		$num = 0;
		$bili = 0;
		for($i=1;$i<count($list);$i++){
			//判断当前用户是否在上线的团队内；
			if($member['lft'] > $list[$i]['lft'] && $member['rgt'] < $list['rgt']){
				//在上线的团队内   
				if($list[$i]['l_level'] > 0 ){
				$class = $this->getUserMoneyByLevel($list[$i]['level']);	
					
				//当前是有领导奖的
					if($list[$i]['l_level'] == $l_level){
						//平级奖		
						$ping_bili = $class['pingji'] * 0.01 ;
						$jiang = $money * $ping_bili ;
						$res[] = $this->addUserMoney($list[$i]['member_id'], $jiang, 18);
					}				
					if($list[$i]['l_level'] > $l_level){
						if($num == 1){
							//级差奖
							$cha_bili = $class['bili_'.$list[$i]['l_level']] * 0.01 - $bili;
							$jiang = $money * $cha_bili ;
							$res[] = $this->addUserMoney($list[$i]['member_id'], $jiang, 17);
						}else{
							//领导奖		1
							$bili = $class['bili_'.$list[$i]['l_level']] * 0.01;
							$jiang = $money * $bili ;
							$res[] = $this->addUserMoney($list[$i]['member_id'], $jiang, $list[$i]['l_level']);
							$num = 1;
						}
					}
					$bili = $class['bili_'.$list[$i]['l_level']];
					$l_level = $list[$i]['l_level'];
					unset($jiang);
				}
			}
		}
		return $res;
	}
	



	/**
	 * 为上线增长业绩
	 * @param 入金的会员信息 $user
	 * @param 入金金额 $money
	 */
	
	public function addYeJi($member_id,$money){
		$list = $this->getUpUserByjiedianId($member_id,9999);
		for($i=1;$i<count($list);$i++){
			if($list[$i-1]['quyu'] == 'a'){
				$data['yeji_a'] = $list[$i]['yeji_a'] + $money;
				$data['a_num'] = $list[$i]['a_num'] + 1 ;
			}else if($list[$i-1]['quyu'] == 'b'){
				$data['yeji_b'] = $list[$i]['yeji_b'] + $money;
				$data['b_num'] = $list[$i]['b_num'] + 1 ;
			}else{
				$data['yeji_c'] = $list[$i]['yeji_c'] + $money;
				$data['c_num'] = $list[$i]['c_num'] + 1 ;
			}
			//为上线加业绩
			$data['yeji'] = $list[$i]['yeji']+$money;
			//为上线加团队人数
			$data['tream_num'] = $list[$i]['tream_num']+1;
			$data['l_level'] = $this->judgLingLevel($list[$i]['member_id']);
			$res[] = Db::name('App_member_relation')->where('member_id='.$list[$i]['member_id'])->update($data);
			unset($data);
		}
		return $res;
	}
	/**
	 *  判断领导奖级别
	 */
	public function judgLingLevel($member_id){
		$member_relation = Db::name('App_member_relation')->where(array('member_id'=>$member_id))->find();
		$class = $this->getUserMoneyByLevel($member_relation['level']);
		$l_level = 0;
		for($i = 7;$i > 0;$i--){
			$quyu = $class['quyu_'.$i];
			$condition = $class['condition_'.$i];
			if($member_relation[$quyu.'_num'] + 1 > $condition){
				$l_level = $i;
				break;
			}
		}
		return $l_level;
	}
	
	
	
	
	
	
	
	
	
	
	

	
	
	
	/**
	 * 判断每日奖励上限
	 * @param unknown $member_id
	 */
	public function judge($member_id,$jiangli){
		$member_relation = Db::name('App_member_relation')->where(array('member_id'=>$member_id))->find();
		$class = $this->getUserMoneyByLevel($member_relation['level']);
		
		//判断每天互助将上线
		$time = $this->toDayTime();
		$aa[] = $time['start'];
		$aa[] = $time['end'];
		$where['member_id'] = $member_id;
		$type[] = 6;
		$type[] = 7;
		$type[] = 8;
		$type[] = 9;
		$type[] = 10;
		$type[] = 11;
		$type[] = 12;
		$type[] = 13;
		$type[] = 14;
		$where['finance_type'] = array('in',$type);
		$where['add_time'] = array('between',$aa);
		$sum_money = Db::name('App_finance')->where($where)->sum('money');
		$all_money = $sum_money + $jiangli;
		
		if($all_money > $class['money']){
			//超出上线了
			$return['money'] = $class['money'] - $sum_money;
			//超出
			$return['type'] = 1;
		}else if($all_money == $class['money']){
			//超出上线了
			$return['money'] = $jiangli;
			//超出
			$return['type'] = 0;
		}else{
			//正常释放
			$return['money'] = $jiangli;
			//超出
			$return['type'] = 0;
		}
		return $return;
	}
	
	
	
	
	
	

	/**
	 * 今日零点到24点时间段
	 * 数组形式返回
	 */
	public function toDayTime(){
		$time['start'] = strtotime(date('Y-m-d',time()));
		$time['end'] = $time['start']+84600;
		return $time;
	}
	
	
	
	/**
	 * 通过节点关系查找
	 * @param unknown $id
	 * @param unknown $lv
	 * @param number $k
	 * @return unknown
	 */
	public function getPidById($id,$k=0){
		$area = Db::name("Areas")->where(array('areaId'=>$id))->find();
		$k++;   
		if (!empty($area)) {
			$item[]=$area;
			if ($k < 3) {
				$list = $this->getPidById($area['parentId'],$k);
				for($i = 0;$i<count($list);$i++){
					if(!empty($list[$i])){
						$item[] = $list[$i];
					}
				}
			}
		}
		return $item;
	}
	/**
	 * 给用户钱包加钱
	 * @param unknown $userId
	 * @param unknown $money
	 */
	public function addUserMoney($member_id,$money,$type){
		
		if($money <= 0){
			return true;
		}
		//根据类型获得对应参数
		$arr = $this->getArrByType($type);
		//判断是否超出上线
		$money = $this->judge($member_id, $money);
		//分配奖励
		$money_arr = $this->fenpei($money['money']);
		
		$jiang_arr = $money_arr['jiang'];
		$fee = $money_arr['fee'];
		//实例化日志api
		$finance = new \FinanceApi();
		foreach($jiang_arr as $k=>$v){
			if($jiang_arr[$k]['money'] >=0){
				if($money['type'] == 1){
					$content = '已达到封顶，'.$arr['content'].'-'.$jiang_arr[$k]['name'];
				}else{
					$content = $arr['content'].'-'.$jiang_arr[$k]['name'];
				}
				//发放奖励
				$r[] = Db::name('App_member_account')->where(array('member_id'=>$member_id))->setInc('account_type_'.$jiang_arr[$k]['type'],$jiang_arr[$k]['money']);
				//添加日志
				$r[] = $finance->addFinance($member_id,$arr['finance_type'],$content,1,$jiang_arr[$k]['money'],$jiang_arr[$k]['type']);	
// 				$r[] = $finance->addFinance($member_id, $finance_type, $content, $money_type, $money, $account_type)
			}
		}
		if($fee['money']){
			$r[] = $finance->addFinance($member_id,6,$arr['content'].'，综合管理费'.$fee['money'],2,$fee['money'],'');
		}
		return $r;
	}           

	
	
	
	/**
	 * 奖励分配
	 * @param unknown $money
	 * @return number
	 */
	public function fenpei($money){
		$config = $this->configs();
		$jiangjin_bili = $config['jiangjin_bili']/100;
		$gudong_bili = $config['gudong_bili']/100;
		$zonghe_bili = $config['zonghe_bili']/100;
		$arr['jiang'][0]['name'] = '奖金';
		$arr['jiang'][0]['money'] = $jiangjin_bili * $money;
		$arr['jiang'][0]['type'] = '1';
		$arr['jiang'][1]['name'] = '股东金';
		$arr['jiang'][1]['money'] = $gudong_bili * $money;
		$arr['jiang'][1]['type'] = '3';
		$arr['fee']['money'] = $zonghe_bili * $money;
		return $arr;
	}
	/**
	 * 配置项信息
	 * @return multitype:
	 */
	public function configApp(){
		//获取配置信息
		$config = DB::name('App_config')->select();
		foreach($config as $k=>$v){
			$list[$v['key']]=$v['value'];
		}
		return $list;
	}
	/**
	 * 获得奖励内容
	 * @param unknown $type
	 * @return string
	 */
	public function getArrByType($type){
		switch ($type){
			case 1:
				$arr['content'] = '一级领导奖';
				$arr['finance_type'] = 8;
				break;
			case 2:
				$arr['content'] = '二级领导奖';
				$arr['finance_type'] = 9;
				break;
			case 3:
				$arr['content'] = '三级领导奖';
				$arr['finance_type'] = 10;
				break;
			case 4:
				$arr['content'] = '四级领导奖';
				$arr['finance_type'] = 11;
				break;
			case 5:
				$arr['content'] = '五级领导奖';
				$arr['finance_type'] = 12;
				break;
			case 6:
				$arr['content'] = '六级领导奖';
				$arr['finance_type'] = 13;
				break;
			case 7:
				$arr['content'] = '七级领导奖';
				$arr['finance_type'] = 14;
				break;
			case 8:
				$arr['content'] = '推荐奖';
				$arr['finance_type'] = 7;
				break;
			case 9:
				$arr['content'] = '报单中心奖';
				$arr['finance_type'] = 15;
				break;
			case 10:
				$arr['content'] = '级差奖';
				$arr['finance_type'] = 17;
				break;
			case 11:
				$arr['content'] = '平级奖';
				$arr['finance_type'] = 18;
				break;
		}
		return $arr;
	}
	/**
	 * 递归查找上级推荐会员
	 * @param unknown $id
	 * @param unknown $lv
	 * @param number $k
	 * @return unknown
	 */
	public function getUpUserByTuiJianId($id,$lv,$k=0){
		$member_relation = Db::name("App_member_relation")->where(array('member_id'=>$id))->find();
		$k++;
		if (!empty($member_relation)) {
			$item[]=$member_relation;
			if ($k<$lv) {
				$list = $this->getUpUserByTuiJianId($member_relation['zhuceid'],$lv,$k);
				for($i = 0;$i<count($list);$i++){
					if(!empty($list[$i])){
						$item[] = $list[$i];
					}
				}
			}
		}
		return $item;
	}
	/**
	 * 递归查找上级节点会员
	 * @param unknown $id
	 * @param unknown $lv
	 * @param number $k
	 * @return unknown
	 */
	public function getUpUserByjiedianId($id,$lv,$k=0){
		$member_relation = Db::name("App_member_relation")->where(array('member_id'=>$id))->find();
		$k++;
		if (!empty($member_relation)) {
			$item[]=$member_relation;
			if ($k<$lv) {
				$list = $this->getUpUserByjiedianId($member_relation['jiedianid'],$lv,$k);
				for($i = 0;$i<count($list);$i++){
					if(!empty($list[$i])){
						$item[] = $list[$i];
					}
				}
			}
		}
		return $item;
	}
	/**
	 * 递归查找下级推荐会员
	 * @param unknown $id
	 * @param unknown $lv
	 * @param number $k
	 * @return unknown
	 */
	public function getDownUserByTuiJianId($id,$lv,$k=0){
		$member_relation = Db::name("App_member_relation")->where(array('member_id'=>$id))->find();
		$k++;
		if (!empty($member_relation)) {
			$item[]=$member_relation;
			if ($k<$lv) {
				$list = $this->getUpUserByTuiJianId($member_relation['zhuceid'],$lv,$k);
				for($i = 0;$i<count($list);$i++){
					if(!empty($list[$i])){
						$item[] = $list[$i];
					}
				}
			}
		}
		return $item;
	}
	/**
	 * 通过节点关系查找
	 * @param unknown $id
	 * @param unknown $lv
	 * @param number $k
	 * @return unknown
	 */
	public function getdown($member_id,$lv,$k=0){
		$down_one = Db::name('App_member_relation')->field('member_id,level')->where(array('zhuceid'=>$member_id))->select();
		if (!empty($down_one)) {
			foreach($down_one as $k=>$v){
				$down_one[$k]['ceng'] = 1;
				$down_one[$k]['count'] = count($down_one);
				$down_two[] = $this->getNowDownMember($down_one[$k]['member_id']);
			}
		}
		//整合所有第二层的用户
		$down_two = $this->hebinArr($down_two,2);
		if(!empty($down_two)){
			foreach($down_two as $m=>$n){
				
				$down_two[$m]['count'] = count($down_two);
				$down_three[] = $this->getNowDownMember($down_two[$m]['member_id']);
			}
			//整合所有第三层的用户
			$down_three = $this->hebinArr($down_three,3);
			if(!empty($down_three)){
				foreach($down_three as $p=>$q){
					$down_three[$p]['count'] = count($down_three);
				}
				$two_three = array_merge($down_two,$down_three);
			}else{
				$two_three = $down_two;
			}
		}
		//将第一层第二层第三层的用户河滨在一起
		if(!empty($two_three)){
			$item = array_merge($down_one,$two_three);
		}else{
			$item = $down_one;
		}
		return $item;
	}
	public function getNowDownMember($member_id){
		$down_member = Db::name('App_member_relation')->field('member_id,level')->where(array('zhuceid'=>$member_id))->select();
		return $down_member;
	}
	/**
	 * 整合当前的用户  从三维数组变成二位数组
	 * @param unknown $arr
	 * @return unknown
	 */
	public function hebinArr($arr,$ceng){
		$array = array();
		if(!empty($arr)){
			foreach($arr as $k=>$v){
				if(!empty($arr[$k])){
					foreach($arr[$k] as $m=>$n){
						//写入数组  第几层的用户
						$arr[$k][$m]['ceng'] = $ceng;
						$array[] = $arr[$k][$m];
					}
				}
			}
		}
		return $array;
	}
	/**
	 * 判断会员等级
	 * @param unknown $level
	 */
	public function getUserMoneyByLevel($level){
		$class = Db::name('App_level')->where(array('id'=>$level))->find();
		return $class;
	}
	//查询配置
	public function configs(){
		$list = Db::name('App_config')->select();
		foreach($list as $key=>$value){
			$list[$value['key']] = $value['value'];
		}
		return $list;
	}
	
}